home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / gfx / 3d / irit50src.lha / irit5 / include / trim_lib.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-12-11  |  5.9 KB  |  152 lines

  1. /******************************************************************************
  2. * Trim_lib.h - header file for the TRIMmed surfaces library.              *
  3. * This header is also the interface header to the world.              *
  4. *******************************************************************************
  5. * Written by Gershon Elber, Oct. 94.                          *
  6. ******************************************************************************/
  7.  
  8. #ifndef TRIM_LIB_H
  9. #define TRIM_LIB_H
  10.  
  11. #include <stdio.h>
  12. #include "irit_sm.h"
  13. #include "imalloc.h"
  14. #include "miscattr.h"
  15. #include "genmat.h"
  16. #include "cagd_lib.h"
  17. #include "symb_lib.h"
  18.  
  19. typedef enum {
  20.     TRIM_ERR_TRIM_CRV_E2 = 2000,
  21.     TRIM_ERR_BZR_BSP_EXPECT,
  22.     TRIM_ERR_DIR_NOT_CONST_UV,
  23.     TRIM_ERR_ODD_NUM_OF_INTER,
  24.  
  25.     TRIM_ERR_UNDEFINE_ERR
  26. } TrimFatalErrorType;
  27.  
  28. /******************************************************************************
  29. * A trimmed surface can have trimming curves that either form a closed loop   *
  30. * or start and end on the boundary of the surface. A trimming curve will be   *
  31. * defined using a list of TrimCrvSegStruct, creating a closed loop or a       *
  32. * curve that starts and ends in the boundary of the surface.              *
  33. *   Orientation of TrimCrvSegStruct should be such that the trimming curve    *
  34. * tangent direction crossed with the surface normal points into the inside.   *
  35. *   EucCrv can be either NULL where the Euclidean location must the be        *
  36. * computed on the fly from parametric information or, if exist, must be       *
  37. * used to prevent from black holes with adjacent surfaces.              *
  38. *   The trimming curves have no order what so ever.                  *
  39. *   An outmost loop will always be present even if the entire four boundary   *
  40. * curves are untrimmed.                                   *
  41. ******************************************************************************/
  42. typedef struct TrimCrvSegStruct {
  43.     struct TrimCrvSegStruct *Pnext;
  44.     IPAttributeStruct *Attr;
  45.     CagdCrvStruct *UVCrv;    /* Trimming crv segment in srf's param. domain. */
  46.     CagdCrvStruct *EucCrv;       /* Trimming curve as an E3 Euclidean curve. */
  47. } TrimCrvSegStruct;
  48.  
  49. typedef struct TrimCrvStruct {
  50.     struct TrimCrvStruct *Pnext;
  51.     IPAttributeStruct *Attr;
  52.     TrimCrvSegStruct *TrimCrvSegList;    /* List of trimming curve segments. */
  53. } TrimCrvStruct;
  54.  
  55. typedef struct TrimSrfStruct {
  56.     struct TrimSrfStruct *Pnext;
  57.     IPAttributeStruct *Attr;
  58.     int Tags;
  59.     CagdSrfStruct *Srf;              /* Surface trimmed by TrimCrvList. */
  60.     TrimCrvStruct *TrimCrvList;                 /* List of trimming curves. */
  61. } TrimSrfStruct;
  62.  
  63. /* Subdivision of trimmed surfaces may result in only one surface returned   */
  64. /* as the other is completely trimmed away. This macros should be used to    */
  65. /* define and identify the two parts.                         */
  66. #define TRIM_IS_FIRST_SRF(Srf)        (((Srf) -> Tags & 0x01) == 0)
  67. #define TRIM_IS_SECOND_SRF(Srf)        (((Srf) -> Tags & 0x01) == 1)
  68. #define TRIM_SET_FIRST_SRF(Srf)        ((Srf) -> Tags &= ~0x01)
  69. #define TRIM_SET_SECOND_SRF(Srf)    ((Srf) -> Tags |= 0x01)
  70.  
  71. #if defined(__cplusplus) || defined(c_plusplus)
  72. extern "C" {
  73. #endif
  74.  
  75. TrimCrvSegStruct *TrimCrvSegNew(CagdCrvStruct *UVCrv, CagdCrvStruct *EucCrv);
  76. TrimCrvSegStruct *TrimCrvSegCopy(TrimCrvSegStruct *TrimCrvSeg);
  77. TrimCrvSegStruct *TrimCrvSegCopyList(TrimCrvSegStruct *TrimCrvSegList);
  78. void TrimCrvSegFree(TrimCrvSegStruct *TrimCrvSeg);
  79. void TrimCrvSegFreeList(TrimCrvSegStruct *TrimCrvSegList);
  80.  
  81. TrimCrvStruct *TrimCrvNew(TrimCrvSegStruct *TrimCrvSegList);
  82. TrimCrvStruct *TrimCrvCopy(TrimCrvStruct *TrimCrv);
  83. TrimCrvStruct *TrimCrvCopyList(TrimCrvStruct *TrimCrvList);
  84. void TrimCrvFree(TrimCrvStruct *TrimCrv);
  85. void TrimCrvFreeList(TrimCrvStruct *TrimCrvList);
  86.  
  87. TrimSrfStruct *TrimSrfNew(CagdSrfStruct *Srf,
  88.               TrimCrvStruct *TrimCrvList,
  89.               CagdBType HasTopLvlTrim);
  90. TrimSrfStruct *TrimSrfNew2(CagdSrfStruct *Srf,
  91.                CagdCrvStruct *TrimCrvList,
  92.                CagdBType HasTopLvlTrim);
  93. TrimSrfStruct *TrimSrfCopy(TrimSrfStruct *TrimSrf);
  94. TrimSrfStruct *TrimSrfCopyList(TrimSrfStruct *TrimSrfList);
  95. void TrimSrfFree(TrimSrfStruct *TrimSrf);
  96. void TrimSrfFreeList(TrimSrfStruct *TrimSrfList);
  97. void TrimSrfTransform(TrimSrfStruct *TrimSrf,
  98.               CagdRType *Translate,
  99.               CagdRType Scale);
  100. void TrimSrfMatTransform(TrimSrfStruct *TrimSrf, CagdMType Mat);
  101. CagdCrvStruct *TrimGetTrimmingCurves(TrimSrfStruct *TrimSrf,
  102.                      CagdBType ParamSpace);
  103. CagdPolylineStruct *TrimCrvs2Polylines(TrimSrfStruct *TrimSrf,
  104.                        CagdBType ParamSpace,
  105.                        int SamplesPerCurve,
  106.                        int Optimal);
  107. CagdCrvStruct *TrimEvalTrimCrvToEuclid(TrimSrfStruct *TrimSrf,
  108.                        CagdCrvStruct *UVCrv);
  109. int TrimSetEuclidComposedFromUV(int EuclidComposedFromUV);
  110.  
  111. CagdRType *TrimSrfEval(TrimSrfStruct *TrimSrf, CagdRType u, CagdRType v);
  112. TrimSrfStruct *TrimSrfDegreeRaise(TrimSrfStruct *TrimSrf, CagdSrfDirType Dir);
  113. TrimSrfStruct *TrimSrfSubdivAtParam(TrimSrfStruct *TrimSrf,
  114.                     CagdRType t,
  115.                     CagdSrfDirType Dir);
  116. TrimSrfStruct *TrimSrfRegionFromTrimSrf(TrimSrfStruct *TrimSrf,
  117.                     CagdRType t1,
  118.                     CagdRType t2,
  119.                     CagdSrfDirType Dir);
  120. TrimSrfStruct *TrimSrfRefineAtParams(TrimSrfStruct *Srf,
  121.                      CagdSrfDirType Dir,
  122.                      CagdBType Replace,
  123.                      CagdRType *t,
  124.                      int n);
  125. TrimSrfStruct *TrimSrfReverse(TrimSrfStruct *TrimSrf);
  126. TrimSrfStruct *TrimSrfReverse2(TrimSrfStruct *TrimSrf);
  127.  
  128. void TrimSrfDomain(TrimSrfStruct *TrimSrf,
  129.            CagdRType *UMin,
  130.            CagdRType *UMax,
  131.            CagdRType *VMin,
  132.            CagdRType *VMax);
  133. CagdRType *TrimSrfEval(TrimSrfStruct *TrimSrf, CagdRType u, CagdRType v);
  134.  
  135. CagdCrvStruct *TrimSrf2Curves(TrimSrfStruct *TrimSrf, int NumOfIsocurves[2]);
  136. CagdPolylineStruct *TrimSrf2Polylines(TrimSrfStruct *TrimSrf,
  137.                       int NumOfIsocurves[2],
  138.                       int SamplesPerCurve,
  139.                       int Optimal);
  140. int TrimSetTrimCrvLinearApprox(int UVSamplesPerCurve,
  141.                    int UVSamplesOptimal);
  142.  
  143. char *TrimDescribeError(TrimFatalErrorType ErrorNum);
  144. void TrimFatalError(TrimFatalErrorType ErrID);
  145. void TrimDbg(void *Obj);
  146.  
  147. #if defined(__cplusplus) || defined(c_plusplus)
  148. }
  149. #endif
  150.  
  151. #endif /* TRIM_LIB_H */
  152.